////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@

// Ακολουθούν μέθοδοι που αφορούν στα τραπέζια.

// Η μέθοδος "trapeziJQL" επιστρέφει jQuery element list για το τραπέζι.
// By default πρέπει η επιστρεφόμενη λίστα να περιέχει ακριβώς ένα στοιχείο.
// Αν, όμως, θέλουμε απλώς να ελέγξουμε την ύπαρξη του σχετικού DOM element
// μπορούμε να περάσουμε true παράμετρο, οπότε μας επιστρέφεται η λίστα
// χωρίς έλεγχο πλήθους.

Trapezi.prototype.trapeziJQL = function(check) {
	if (check) return $('#TR' + this.kodikos);
	return $('#TR' + this.kodikos).akrivosEna();
}

Trapezi.prototype.trapeziBoxJQL = function() {
	return $('#TR' + this.kodikos).find('.trapeziBox').akrivosEna();
}

Trapezi.prototype.trapeziThesiJQL = function(thesi) {
	return Trapezi.trapeziThesiJQL(this.kodikos, thesi);
}

Trapezi.trapeziThesiJQL = function(trapeziKodikos, thesi) {
	return $('#TP' + trapeziKodikos + '\\:' + thesi);
}

// Η μέθοδος "trapeziAddDOM" δημιουργεί DOM element για το τραπέζι και το εντάσσει
// στο DOM. Η μέθοδος λειτουργεί μόνο προσθετικά και όχι ενημερωτικά, δηλαδή το
// τραπέζι δεν πρέπει να υπάρχει στο DOM.

Trapezi.prototype.trapeziAddDOM = function(neo) {
	var html, trapezi, thesi;

	this.trapeziJQL(true).kanena();
	html = '<div id="TR' + this.kodikos + '" class="trapezi">';
	html += '<div class="trapeziBox">';
	html += '<div class="trapeziData"></div>';
	for (thesi = 1; thesi <= Prefadoros.thesiMax; thesi++) html += '<div id="TP' +
		this.kodikos + ':' + thesi + '" class="pektisBox trapeziPektisBox"></div>';
	html += '<div class="trapeziStisimoArea"></div>';
	html += '</div>';
	html += '<div class="trapeziTheatisArea"></div>';
	html += '</div>';
	trapezi = $(html).trapeziFixDOM(this);

	if (neo) trapezi.css({
		opacity: 0,
		maxHeight: 0,
		overflowY: 'hidden',
	});
	$('#trapeziArea').prepend(trapezi);
	if (neo) trapezi.finish().animate({
		opacity: 1,
		maxHeight: '200px',
	}, 1000, function() {
		$(this).css({
			opacity: '',
			overflowY: '',
		});
	});

	return trapezi;
}

// Η μέθοδος "trapeziDelDOM" διαγράφει το τραπέζι από το DOM. Η διαγραφή γίνεται
// με ομαλό τρόπο και επιστρέφεται το τραπέζι.

Trapezi.prototype.trapeziDelDOM = function() {
	this.trapeziJQL().stop().animate({
		opacity: 0,
		maxHeight: 0,
	}, function() {
		$(this).remove();
	});

	return this;
}

// Η μέθοδος "trapeziProsklisiDelDOM" διαγράφει από το DOM τις προσκλήσεις τού
// τραπεζιού. Αν έχουμε περάσει λίστα προσκλήσεων, τότε διαγράφονται ΑΥΤΕΣ οι
// προσκλήσεις (χρησιμοποιείται κατά τη διαγραφή τραπεζιού).

Trapezi.prototype.trapeziProsklisiDelDOM = function(llist) {
	var i;

	if (llist === undefined) llist = this.prosklisi;
	for (i in llist) llist[i].prosklisiDelDOM();

	return this;
}

// Η μέθοδος "trapeziFixDOM" εφαρμόζεται σε jQuery single element list
// τραπεζιού και επαναδιαμορφώνει το σχετικό DOM element. Δέχεται ως
// παράμετρο το ίδιο το τραπέζι.

jQuery.fn.trapeziFixDOM = function(trapezi) {
	return $(this).akrivosEna().each(function() {
		var thesi, harea, login;

		$(this).find('.trapeziBox').idiotikotitaFixDOM(trapezi);
		$(this).trapeziDataFixDOM(trapezi);
		$(this).stisimoFixDOM(trapezi);
		if (trapezi.isEgo()) {
			$('#tsoxa').
				idiotikotitaFixDOM(trapezi).
				stisimoFixDOM(trapezi);
		}

		for (thesi = 1; thesi <= Prefadoros.thesiMax; thesi++) {
			$(this).trapeziPektisFixDOM(trapezi, thesi);
		}

		harea = $(this).find('.trapeziTheatisArea').empty();
		for (login in trapezi.theatis) {
			$(this).trapeziTheatisAddDOM(login, harea);
			if (trapezi.isEgo()) trapezi.tsoxaTheatisAddDOM(login);
		}
	});
}

Trapezi.prototype.trapeziPektisFixDOM = function(thesi) {
	if (thesi) {
		$('#TR' + this.kodikos).trapeziPektisFixDOM(this, thesi);
	}
	else {
		for (thesi in Prefadoros.thesiValid) {
			this.trapeziPektisFixDOM(thesi);
		}
	}

	return this;
}

Trapezi.prototype.trapeziTheatisAddDOM = function(login) {
	$('#TR' + this.kodikos).trapeziTheatisAddDOM(login);
	if (this.oxiEgo()) return this;
	return this.tsoxaTheatisAddDOM(login);
}

Trapezi.prototype.trapeziTheatisDelDOM = function(login) {
	var slogin = login.jqsel();
	$('#TH' + slogin + ',#SH' + slogin).remove();
}

Trapezi.prototype.idiotikotitaFixDOM = function() {
	$('#TR' + this.kodikos).find('.trapeziBox').idiotikotitaFixDOM(this);
}

jQuery.fn.idiotikotitaFixDOM = function(trapezi) {
	return this.each(function() {
		if (trapezi.isDimosio()) $(this).removeClass('trapeziPrive');
		else $(this).addClass('trapeziPrive');
	});
}

Trapezi.prototype.trapeziDataFixDOM = function() {
	this.trapeziJQL().trapeziDataFixDOM(this);
	return this;
}

// Η μέθοδος "trapeziDataFixDOM" εφαρμόζεται σε jQuery single element list
// τραπεζιού και επαναδιαμορφώνει την πλακέτα ταυτότητας του τραπεζιού.
// Δέχεται ως παράμετρο το ίδιο το τραπέζι.

jQuery.fn.trapeziDataFixDOM = function(trapezi) {
	return $(this).akrivosEna().each(function() {
		var del, html;

		del = $(this).find('.trapeziData').akrivosEna();

		if (trapezi.isProskeklimenos(Prefadoros.ego.login)) {
			del.addClass('trapeziDataProsklisi').removeClass('trapeziDataPrive');
		}
		else {
			del.removeClass('trapeziDataProsklisi');
			if (trapezi.isPrive()) del.addClass('trapeziDataPrive');
			else del.removeClass('trapeziDataPrive');
		}

		if (trapezi.isEgo()) del.addClass('trapeziDataEgo');
		else del.removeClass('trapeziDataEgo');

		html = '<div class="trapeziDataKodikos';
		if (trapezi.kodikos > 999999) html += ' trapeziDataKodikosPiknos';
		html += '">' + trapezi.kodikos + '</div>';

		html += '<div class="trapeziDataKasa">' + (trapezi.kasa() * 3) + '</div>';

		html += '#';

		html += '<div class="trapeziDataIpolipo">' + trapezi.ipolipo() + '</div>';

		del.html(html).off('click').on('click', function(e) {
			e.stopPropagation();
			Prefadoros.input.apiko();
			del.removeClass('trapeziDataEpilogi');
			trapezi.trapeziIsodos(del);
		});
	});
}

Trapezi.prototype.trapeziIsodos = function(del) {
	if (this.isProskeklimenos(Prefadoros.ego.login)) return this.trapeziIsodosTora(del);
	if (this.isDimosio()) return this.trapeziIsodosTora(del);
	Client.fyi.spano('Δεν μπορείτε να εισέλθετε στο τραπέζι');
	return this;
}

Trapezi.prototype.trapeziIsodosTora = function(del) {
	var wrk;

	if (!del) del = this.trapeziJQL().find('.trapeziData');
	Client.fyi.pano('Είσοδος στο τραπέζι <span class="entono ble">' + this.kodikos + '</span>');
	del.dataFlush();

	if (Prefadoros.ego.sinedria.trapezi == this.kodikos) return Prefadoros.optiki.partida();

	wrk = $('<img>').attr({src: 'images/working/fino.gif'}).addClass('trapeziIsodosIcon').
	prependTo(del);

	Client.node('trapeziIsodos', 'trapezi=' + this.kodikos, function(rsp) {
		wrk.fadeOut(function() {
			$(this).remove();
		});
		Client.fyi.spano(rsp);
		if (rsp) return;
	});
	return this;
}

jQuery.fn.dataFlush = function() {
	return $(this).each(function() {
		$(this).finish().animate({
			top: '-=2px',
			left: '-=2px',
			width: '+=4px',
			height: '+=4px',
			paddingTop: '+=2px',
			paddingLeft: '+=2px',
		}, 50, function() {
			$(this).finish().animate({
				top: '+=2px',
				left: '+=2px',
				width: '-=4px',
				height: '-=4px',
				paddingTop: '-=2px',
				paddingLeft: '-=2px',
			}, 100);
		});
	});
}

Trapezi.prototype.isEgo = function() {
	if (Prefadoros.ego.sinedria.oxiTrapezi()) return false;
	return(Prefadoros.ego.trapezi.kodikos == this.kodikos);
}

// Η μέθοδος "trapeziPektisFixDOM" εφαρμόζεται σε jQuery single element list
// τραπεζιού και επαναδιαμορφώνει συγκεκριμένη θέση του τραπεζιού. Περνάμε
// ως παραμέτρους το ίδιο το τραπέζι και τη θέση.

jQuery.fn.trapeziPektisFixDOM = function(trapezi, thesi) {
	return $(this).akrivosEna().each(function() {
		var jql, login;

		jql = $(this).find('#TP' + trapezi.kodikos + '\\:' + thesi).akrivosEna();

		login = trapezi.pektis(thesi);
		if (login) jql.html(Skiniko.fetchPektis(login).onomaDOM());
		else jql.empty();

		jql.axiomaDOM().pektisFixDOM(login).apodoxiFixDOM(trapezi, thesi);

		if (trapezi.oxiEgo()) return;
		trapezi.tsoxaThesiFixDOM(thesi);
	});
}

Trapezi.prototype.apodoxiFixDOM = function(thesi) {
	var jql;

	if (thesi === undefined) {
		for (thesi in Prefadoros.thesiValid) {
			this.apodoxiFixDOM(thesi);
		}

		return this;
	}

	jql = this.trapeziThesiJQL(thesi);
	if (this.isEgo()) jql = jql.add(Trapezi.tsoxaThesiMapJQL(thesi).find('.pektisBox'));
	jql.apodoxiFixDOM(this, thesi);

	return this;
}

jQuery.fn.apodoxiFixDOM = function(trapezi, thesi) {
	return $(this).each(function() {
		var login;
		login = trapezi.pektis(thesi);
		if (!login) $(this).removeClass('apodoxi oxiApodoxi');
		else if (trapezi['apodoxi' + thesi]) $(this).removeClass('oxiApodoxi').addClass('apodoxi');
		else $(this).removeClass('apodoxi').addClass('oxiApodoxi');
	});
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@

// Τα ενδεικτικά εικονίδια ρυθμίσεων του τραπεζιού εμφανίζονται στην περιοχή
// "trapeziStisimoArea" ως "trapeziStisimoIcon" images μέσα σε "trapeziStisimoContainer"
// divs.

// Η jQuery μέθοδος "trapeziStisimoIcon" εφαρμόζεται σε κουτί τραπεζιού και σκοπό έχει την
// εμφάνιση ή την απόσυρση ενδεικτικού εικονιδίου σχετικού με κάποια ρύθμιση που αφορά στο
// τραπέζι, ανάλογα με το αν η πρώτη παράμετρος είναι αληθής ή ψευδής αντίστοιχα. Ως δεύτερη
// παράμετρο περνάμε μια κωδική ονομασία της ρύθμισης, π.χ. "Asoi", "Paso", "Epetiaki" κλπ.
// Ακολουθεί το αρχείο εικόνας και μια περιγραφή που θα χρησιμοποιηθεί ως title στο σχετικό
// εικονίδιο.

jQuery.fn.trapeziStisimoIcon = function(nai, param, img, title) {
	return $(this).each(function() {
		var jql, tt, klasi;

		tt = $(this).parent().attr('id') == 'tsoxa' ? 'tsoxa' : 'trapezi';
		jql = $(this).find('.trapeziStisimo' + param);
		if (!nai) {
			jql.stop().fadeOut(300, function() {
				$(this).remove();
			});
			return;
		}

		jql.remove();
		klasi = tt + 'StisimoContainer trapeziStisimo' + param;
		if ((tt == 'tsoxa') && (param == 'Epetiaki')) klasi += ' tsoxaStisimoEpetiaki';
		$('<div>').addClass(klasi).append($('<img>').attr({
			src: 'images/' + img,
			title: title,
		}).addClass('trapeziStisimoIcon').fadeIn(200)).
		appendTo($(this));
	});
}

// Η jQuery μέθοδος "stisimoFixDOM" εφαρμόζεται σε "trapeziBox" DOM element
// και σκοπό έχει την επαναδιαμόρφωση τής περιοχής ενδείξεων του τραπεζιού.
// Ως παράμετρο δέχεται το ίδιο το τραπέζι.

jQuery.fn.stisimoFixDOM = function(trapezi) {
	return $(this).akrivosEna().each(function() {
		$(this).find('.trapeziStisimoArea').
			stisimoPriveFixDOM(trapezi).
			stisimoPasoFixDOM(trapezi).
			stisimoAsoiFixDOM(trapezi).
			stisimoPostelFixDOM(trapezi).
			stisimoFilikiFixDOM(trapezi).
			stisimoKlistoFixDOM(trapezi).
			stisimoIdioktitoFixDOM(trapezi).
			stisimoEpetiakiFixDOM(trapezi);
	});
}

Trapezi.prototype.stisimoAsoiFixDOM = function() {
	var jql = this.trapeziJQL();
	if (this.isEgo()) jql = jql.add($('#tsoxa'));
	jql.find('.trapeziStisimoArea').stisimoAsoiFixDOM(this);
	return this;
}

jQuery.fn.stisimoAsoiFixDOM = function(trapezi) {
	return $(this).each(function() {
		$(this).trapeziStisimoIcon(trapezi.oxiAsoi(), 'Asoi', 'cpanel/asoiOn.png', 'Δεν παίζονται οι άσοι');
	});
}

Trapezi.prototype.stisimoPasoFixDOM = function() {
	var jql = this.trapeziJQL();
	if (this.isEgo()) jql = jql.add($('#tsoxa'));
	jql.find('.trapeziStisimoArea').stisimoPasoFixDOM(this);
	return this;
}

jQuery.fn.stisimoPasoFixDOM = function(trapezi) {
	return $(this).each(function() {
		$(this).trapeziStisimoIcon(trapezi.isPaso(), 'Paso', 'cpanel/pasoOn.png', 'Παίζεται το πάσο');
	});
}

Trapezi.prototype.stisimoFilikiFixDOM = function() {
	var jql = this.trapeziJQL();
	if (this.isEgo()) jql = jql.add($('#tsoxa'));
	jql.find('.trapeziStisimoArea').stisimoFilikiFixDOM(this);
	return this;
}

jQuery.fn.stisimoFilikiFixDOM = function(trapezi) {
	return $(this).each(function() {
		$(this).trapeziStisimoIcon(trapezi.isFiliki(), 'Filiki', 'cpanel/filiki.png', 'Φιλική παρτίδα');
	});
}

Trapezi.prototype.stisimoPostelFixDOM = function() {
	var jql = this.trapeziJQL();
	if (this.isEgo()) jql = jql.add($('#tsoxa'));
	jql.find('.trapeziStisimoArea').stisimoPostelFixDOM(this);
	return this;
}

jQuery.fn.stisimoPostelFixDOM = function(trapezi) {
	return $(this).each(function() {
		switch (trapezi.telioma()) {
		case 'U':
			$(this).trapeziStisimoIcon(true, 'Postel', 'cpanel/postel/anisoropo.png',
				'Ανισόρροπη πληρωμή τελευταίας διανομής');
			break;
		case 'F':
			$(this).trapeziStisimoIcon(true, 'Postel', 'cpanel/postel/dikeo.png',
				'Δίκαιη πληρωμή τελευταίας διανομής');
			break;
		default:
			$(this).trapeziStisimoIcon(false, 'Postel');
			break;
		}
	});
}

Trapezi.prototype.stisimoIdioktitoFixDOM = function() {
	var jql = this.trapeziJQL();
	if (this.isEgo()) jql = jql.add($('#tsoxa'));
	jql.find('.trapeziStisimoArea').stisimoIdioktitoFixDOM(this);
	return this;
}

jQuery.fn.stisimoIdioktitoFixDOM = function(trapezi) {
	return $(this).each(function() {
		$(this).trapeziStisimoIcon(trapezi.isIdioktito(), 'Idioktito', 'cpanel/idioktito.png',
			'Ιδιόκτητο τραπέζι');
	});
}

Trapezi.prototype.stisimoPriveFixDOM = function() {
	var jql = this.trapeziJQL();
	if (this.isEgo()) jql = jql.add($('#tsoxa').idiotikotitaFixDOM(this));
	jql.find('.trapeziStisimoArea').stisimoPriveFixDOM(this);
	return this;
}

jQuery.fn.stisimoPriveFixDOM = function(trapezi) {
	return $(this).each(function() {
		$(this).trapeziStisimoIcon(trapezi.isPrive(), 'Prive', 'cpanel/prive.png', 'Πριβέ τραπέζι');
	});
}

Trapezi.prototype.stisimoKlistoFixDOM = function() {
	var jql = this.trapeziJQL();
	if (this.isEgo()) jql = jql.add($('#tsoxa'));
	jql.find('.trapeziStisimoArea').stisimoKlistoFixDOM(this);
	return this;
}

jQuery.fn.stisimoKlistoFixDOM = function(trapezi) {
	return $(this).each(function() {
		$(this).trapeziStisimoIcon(trapezi.isKlisto(), 'Klisto', 'cpanel/klisto.png',
			'Φύλλα κλειστά για τους θεατές');
	});
}

Trapezi.prototype.stisimoEpetiakiFixDOM = function() {
	var jql = this.trapeziJQL();
	if (this.isEgo()) jql = jql.add($('#tsoxa'));
	jql.find('.trapeziStisimoArea').stisimoEpetiakiFixDOM(this);
	return this;
}

jQuery.fn.stisimoEpetiakiFixDOM = function(trapezi) {
	return $(this).each(function() {
		$(this).trapeziStisimoIcon(trapezi.isEpetiaki(), 'Epetiaki', 'stolismos/balonia.png', 'Επετειακή παρτίδα');
	});
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@

jQuery.fn.trapeziTheatisAddDOM = function(login, harea) {
	return $(this).akrivosEna().each(function() {
		if (!harea) harea = $(this).find('.trapeziTheatisArea');
		harea.akrivosEna().prepend(Skiniko.fetchPektis(login).pektisDOM('TH').pektisFixDOM(login));
	});
}

// Η μέθοδος "trapeziThesiCopy" εφαρμόζεται σε πρόχειρο τραπέζι και σκοπό έχει
// να θέσει τα στοιχεία θέσης των παικτών ίδια με αυτά του τραπεζιού το
// οποίο περνάμε ως παράμετρο. Τα στοιχεία τίθενται με κάπως αυστηρό τρόπο
// ώστε να μπορεί γίνει ασφαλής σύγκριση με άλλο παρόμοιο αντικείμενο.

Trapezi.prototype.trapeziThesiCopy = function(trapezi) {
	var i, thesi;

	// "Αδειάζω" το τραπέζι από τυχόν properties.

	for (i in this) delete this[i];

	// Αντιγράφω τον κωδικό τραπεζιού και τα στοιχεία θέσης και
	// αποδοχής των παικτών.

	this.kodikos = trapezi.kodikos;
	for (thesi in Prefadoros.thesiValid) {
		i = 'pektis' + thesi;
		if (trapezi.hasOwnProperty(i)) this[i] = trapezi[i];

		i = 'apodoxi' + thesi;
		if (trapezi.hasOwnProperty(i)) this[i] = trapezi[i];
	}

	return this;
}

Trapezi.prototype.trapeziThesiDif = function(trapezi) {
	for (thesi in Prefadoros.thesiValid) {
		i = 'pektis' + thesi;
		if (this[i] !== trapezi[i]) return true;

		i = 'apodoxi' + thesi;
		if (this[i] !== trapezi[i]) return true;
	}

	return false;
}

Trapezi.prototype.trapeziThesiSame = function(trapezi) {
	return !this.trapeziThesiDif(trapezi);
}

// Η μέθοδος "stisimoEndixi" χρησιμοποιείται κυρίως κατά το στήσιμο της παρτίδας
// και σκοπό έχει να κάνει εμφανείς τις σχετικές ενέργειες των παικτών ή των
// υπολοίπων εξουσιοδοτημένων παικτών. Η μέθοδος εφαρμόζεται στο τραπέζι στο
// οποίο γίνονται αλλαγές και δέχεται ως παραμέτρους τη συνεδρία του παίκτη
// που κάνει την αλλαγή, την περιγραφή της ενέργειας και το source του σχετικού
// εικονιδίου.

Trapezi.prototype.stisimoEndixi = function(sinedria, desc, ico) {
	var jql, slogin, p, q;

	// Οι έλεγχοι που ακολουθούν είναι μάλλον περιττοί.

	if (sinedria.oxiTrapezi()) return;
	if (sinedria.trapezi != this.kodikos) return;

	// Αν η αλλαγή αφορά στο δικό μας τραπέζι δίνουμε ηχητικό σήμα.

	if (this.isEgo()) Client.sound.stisimoEndixi();

	// Οι αλλαγές στο τραπέζι γίνονται συνήθως από τους παίκτες τού τραπεζιού,
	// μπορεί όμως να γίνονται και από εξουσιοδοτημένους παίκτες που δεν είναι
	// παίκτες τού τραπεζιού.

	// Επιλέγουμε τα κουτάκια παίκτη που αφορούν στον παίκτη/θεατή που έκανε
	// την αλλαγή και μέσα σε κάθε κουτάκι εντοπίζουμε την περιοχή ενδείξεων.

	if (sinedria.isPektis()) jql = this.trapeziThesiJQL(sinedria.thesi);
	else jql = sinedria.sinedriaTheatisJQL();

	jql = jql.find('.stisimoEndixiContainer');
	if (this.isEgo() && sinedria.isPektis()) jql = jql.add(Trapezi.tsoxaThesiMapJQL(sinedria.thesi).
		find('.stisimoEndixiContainer'));

	// Προετοιμάζουμε τον φορέα τής ένδειξης ο οποίος θα συμπεριλάβει
	// το σχετικό εικονίδιο, και τον τοποθετούμε στην περιοχή ενδείξεων
	// προγραφή διαγραφής στο εγγύς μέλλον.

	p = $('<div>').addClass('stisimoEndixiIconContainer').appendTo(jql).
	delay(3000).fadeOut(1000, function() {
		$(this).remove();
	});

	// Τοποθετούμε το εικονίδιο της σχετικής ένδειξης μέσα στον φορέα
	// που μόλις δημιουργήσαμε.

	q = $('<img>').addClass('stisimoEndixiIcon').attr({
		title: desc,
		src: 'images/' + ico,
	}).appendTo(p).fadeIn(100);
}

// Ακολουθεί πολύ σημαντική function που αφορά στην ενημέρωσή μας από τον
// server για τη συζήτηση του τραπεζιού και τις ενέργειες της τρέχουσας
// διανομής. Η function πρέπει να καλείται κάθε φορά που αλλάζουμε τραπέζι.

Trapezi.refresh = function(ixos) {
	var trapezi;

	if (ixos === undefined) ixos = true;
	trapezi = Prefadoros.ego.trapezi;
	if (!trapezi) {
		Prefadoros.sizitisi.trapeziJQL.empty();
		$('#tsoxa').addClass('tsoxaKeni').removeClass('tsoxaTheatis trapeziPrive');
		$('#tsoxaPektis1').removeClass('tsoxaPektisSteno');
		$('.tsoxaFila').css({display: 'none'});
		$('#PXpanel').remove();
		$('#PXgipedo').remove();
		$('#PXminima').remove();
		Prefadoros.optiki.kafenio();
		if (ixos) Client.sound.plop();
		return;
	}

	Prefadoros.sizitisi.trapeziJQL.data('noScroll', false).removeClass('sizitisiScrollOff').
		html($('<div class="plagia">Ανανέωση συζητήσεως. Παρακαλώ περιμένετε…</div>'));
	Client.node('trapeziRefresh', function(rsp) {
		var data;

//console.log('Trapezi.refresh:', rsp);
		try {
			eval('data = {"?":0' + rsp + '}');
		} catch(e) {
			globals.fatal('Παρελήφθησαν λανθασμένα δεδομένα');
		}

		trapezi.
		sizitisiSet(data['Z']).
		energiaSet(data['E']);

		setTimeout(function() {
			Prefadoros.sizitisi.trapeziJQL.finish().scrollKato();
		}, 100);
		Prefadoros.feredata.metenergia();
		Prefadoros.optiki.partida();
		if (ixos) Client.sound.pop();
	});
}

// Η μέθοδος "sizitisiSet" δέχεται ένα array συζήτησης και το καθιστά array
// συζήτησης τού ανά χείρας τραπεζιού. Μπορούμε να μην περάσουμε array συζήτησης,
// οπότε απλώς θα "καθαρίσουμε" της συζήτηση του τραπεζιού.

Trapezi.prototype.sizitisiSet = function(sizitisi) {
	Prefadoros.sizitisi.trapeziJQL.empty();
	if (!sizitisi) return this;

	Prefadoros.sizitisi.trapeziJQL.feredataSet(sizitisi);
	return this;
}

// Η μέθοδος "energiaSet" δέχεται ένα array ενεργειών και το αναθέτει ως array
// ενεργειών της τελευταίας διανομής τού ανά χείρας τραπεζιού.
//
// Πριν την ανάθεση των ενεργειών στην τελευταία διανομή, η μέθοδος διαγράφει
// όλες τις ενέργειες από όλες τις διανομές τού τραπεζιού. Μπορούμε να μην
// περάσουμε array ενεργειών, οπότε η μέθοδος θα μείνει στον καθαρισμό των
// ενεργειών.
//
// Προσοχή!
// --------
// Η μέθοδος δεν διαγράφει τις ενέργειες του προηγούμενου τραπεζιού. Αυτές
// θα διαγραφούν στην επόμενη επίσκεψη σε αυτό το τραπέζι. Με άλλα λόγια,
// αν ο παίκτης μετακινείται από τραπέζι σε τραπέζι, τότε στον client θα
// έχουμε διανομές με σπαράγματα ενεργειών σε όλα τα τραπέζια που έχει
// επισκεφτεί.

Trapezi.prototype.energiaSet = function(energia) {
	var i, dianomi;
console.log('Trapezi.energiaSet');

	// Πρώτα διαγράφουμε τυχόν ενέργειες από όλες τις
	// διανομές τού τραπεζιού.

	for (i = 0; i < this.dianomi.length; i++) {
		dianomi = this.dianomi[i];
		delete dianomi.energia;
	}
	if (!i) return this;

	if (!energia) return this;
	if (!energia.length) return this;

	// Υπάρχουν διανομές και έχουμε στα χέρια μας την τελευταία, επομένως
	// θα της αναθέσουμε το array ενεργειών.

	dianomi.energia = [];
	for (i = 0; i < energia.length; i++) {
		this.energiaAdd(new Energia().feredataSet(energia[i]));
	}

	// Αφού «φορτωθούν» όλες οι ενέργειες της τελευταίας διανομής, τις
	// διατρέχουμε κάνοντας τις σχετικές αλλαγές στο DOM.

	this.energiaDOM();
	return this;
}
